Skip to content

feat(acp): add machine stdio transport for Acepe#2858

Open
flazouh wants to merge 6 commits into
tailcallhq:mainfrom
flazouh:feat/machine-stdio-acp
Open

feat(acp): add machine stdio transport for Acepe#2858
flazouh wants to merge 6 commits into
tailcallhq:mainfrom
flazouh:feat/machine-stdio-acp

Conversation

@flazouh
Copy link
Copy Markdown

@flazouh flazouh commented Apr 5, 2026

Abstract

This PR adds a real forge machine stdio entrypoint backed by Forge's ACP stdio transport. It is primarily for our app, Acepe, which needs to launch Forge from a stable CLI surface without depending on an unpublished feature branch.

Product Context

Acepe is our desktop app for running and managing coding agents across providers and protocols.

Product links:

Problem

Acepe integrates Forge as an installable local provider. That integration needed a released Forge command that can:

  • start a machine-oriented stdio session from the public CLI
  • speak ACP over stdio instead of only parsing a placeholder command
  • be launched by Acepe as a normal installed binary

Before this change, the relevant command path was missing on main. We could add parser coverage for forge machine stdio, but that would still leave the command non-functional at runtime, which does not unblock Acepe.

Solution

This change wires the machine-facing CLI entrypoint all the way through to a working ACP stdio server:

  • adds machine stdio as a first-class top-level CLI command
  • routes the CLI command through forge_main into a dedicated stdio runner
  • extends the public API surface with acp_start_stdio() so the transport can be started through the current app/service stack
  • ports the ACP stdio transport implementation into forge_app
  • adds the required ACP dependency wiring in the workspace and app manifests
  • preserves parser-level coverage and adds transport-adjacent verification

The intent is to keep the public invocation simple while making the underlying server path real and launchable by external applications.

ASCII Schemas

Before

+---------+              +------------------------+
| Acepe   | -- spawn --> | forge machine stdio    |
| app     |              | on forge main          |
+---------+              +-----------+------------+
                                    |
                                    v
                         +------------------------+
                         | missing / non-working  |
                         | machine transport      |
                         +------------------------+
                                    |
                                    v
                             integration blocked

After

+---------+              +------------------------+
| Acepe   | -- spawn --> | forge machine stdio    |
| app     |              | stable CLI entrypoint  |
+---------+              +-----------+------------+
                                    |
                                    v
                         +------------------------+
                         | forge_main acp_runner  |
                         +-----------+------------+
                                    |
                                    v
                         +------------------------+
                         | forge_api::            |
                         | acp_start_stdio()      |
                         +-----------+------------+
                                    |
                                    v
                         +------------------------+
                         | forge_app ACP stdio    |
                         | transport + adapter    |
                         +-----------+------------+
                                    |
                                    v
                         +------------------------+
                         | Acepe <-> Forge over   |
                         | ACP / stdio            |
                         +------------------------+

Ownership Boundary

Acepe responsibilities
----------------------
- install Forge
- discover provider
- spawn `forge machine stdio`
- speak ACP over stdio

Forge responsibilities
----------------------
- expose stable machine CLI
- initialize ACP transport
- adapt ACP requests into Forge services
- stream ACP responses back over stdio

Why This Is For Acepe

Acepe needs Forge to expose a stable, installable machine transport from main so our desktop app can launch Forge directly as a provider. This PR moves that capability into the open-source Forge repo so Acepe no longer has to depend on branch-specific or unpublished transport work.

Files Of Interest

  • crates/forge_main/src/cli.rs
  • crates/forge_main/src/ui.rs
  • crates/forge_main/src/acp_runner.rs
  • crates/forge_api/src/api.rs
  • crates/forge_api/src/forge_api.rs
  • crates/forge_app/src/acp_app.rs
  • crates/forge_app/src/acp/

Verification

I verified the change with:

env PROTOC=/tmp/protoc-28.3/bin/protoc cargo test --manifest-path /Users/alex/Documents/forgecode/Cargo.toml -p forge_main machine_stdio
env PROTOC=/tmp/protoc-28.3/bin/protoc cargo test --manifest-path /Users/alex/Documents/forgecode/Cargo.toml -p forge_app acp
env PROTOC=/tmp/protoc-28.3/bin/protoc cargo test --manifest-path /Users/alex/Documents/forgecode/Cargo.toml -p forge_app acp::conversion

Notes

  • protoc was not available on PATH in the local environment, so verification used a staged temporary binary.
  • The PR is intentionally focused on exposing the stdio ACP transport through the current CLI/API layers rather than reworking unrelated provider or UI behavior.

Expose a machine stdio entrypoint in Forge and route it through a real ACP stdio transport so Acepe can launch Forge as an installable provider instead of depending on an unpublished branch.

Co-Authored-By: ForgeCode <noreply@forgecode.dev>
@github-actions github-actions Bot added the type: feature Brand new functionality, features, pages, workflows, endpoints, etc. label Apr 5, 2026
@CLAassistant
Copy link
Copy Markdown

CLAassistant commented Apr 5, 2026

CLA assistant check
All committers have signed the CLA.

Comment on lines +39 to +42
fn acp_start_stdio(&self) -> impl std::future::Future<Output = Result<()>> + Send {
self.called.store(true, Ordering::SeqCst);
async { Ok(()) }
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The test implementation has incorrect async behavior. The self.called.store() executes immediately when the future is created, not when it's awaited. This means the test doesn't accurately verify that the async function is actually executed.

fn acp_start_stdio(&self) -> impl std::future::Future<Output = Result<()>> + Send {
    let called = self.called.clone();
    async move {
        called.store(true, Ordering::SeqCst);
        Ok(())
    }
}
Suggested change
fn acp_start_stdio(&self) -> impl std::future::Future<Output = Result<()>> + Send {
self.called.store(true, Ordering::SeqCst);
async { Ok(()) }
}
fn acp_start_stdio(&self) -> impl std::future::Future<Output = Result<()>> + Send {
let called = self.called.clone();
async move {
called.store(true, Ordering::SeqCst);
Ok(())
}
}

Spotted by Graphite

Fix in Graphite


Is this helpful? React 👍 or 👎 to let us know.

- Replace unbounded notification channel with bounded (1024) to apply
  backpressure when the client stalls
- Add per-session model override to prevent concurrent sessions from
  interfering with each other
- Replace From<Error> impl with explicit into_acp_error() per project
  guidelines
- Extract classify_mcp_tool() and convert to free functions, removing
  the unnecessary ToolOutputConverter struct
- Validate MCP server names (length, charset) to prevent injection
- Add MAX_BLOB_SIZE (50 MB) guard on base64-decoded resources
- Add I/O timeout (5 min) and graceful shutdown drain (5 s) to prevent
  indefinite hangs
- Track cancellation via AtomicBool across loop iterations
- Log warnings instead of silently ignoring reload/config errors
- Add tests for tool kind mapping, file extraction, and edge cases

Co-Authored-By: ForgeCode <noreply@forgecode.dev>
@flazouh flazouh force-pushed the feat/machine-stdio-acp branch from a2e5e58 to 8fe513f Compare April 5, 2026 22:58
The store ran eagerly on function call, not when the future was
awaited. Move it into the async block so the test actually verifies
that the caller awaits the returned future.

Co-Authored-By: ForgeCode <noreply@forgecode.dev>
@github-actions
Copy link
Copy Markdown

Action required: PR inactive for 5 days.
Status update or closure in 10 days.

@github-actions github-actions Bot added the state: inactive No current action needed/possible; issue fixed, out of scope, or superseded. label Apr 13, 2026
@github-actions
Copy link
Copy Markdown

PR closed after 10 days of inactivity.

@github-actions github-actions Bot closed this Apr 24, 2026
@github-actions github-actions Bot removed the state: inactive No current action needed/possible; issue fixed, out of scope, or superseded. label Apr 24, 2026
@flazouh
Copy link
Copy Markdown
Author

flazouh commented Apr 24, 2026

@amitksingh1490 thanks for looking at this for our user requesting forge integration !

@amitksingh1490 amitksingh1490 enabled auto-merge (squash) April 24, 2026 17:44
@amitksingh1490 amitksingh1490 disabled auto-merge April 24, 2026 17:44
@amitksingh1490
Copy link
Copy Markdown
Contributor

@flazouh could you please resolve the conflicts would love to integrate this. We are thinking we should introduce a beta feature flag till the time we stablise this and then once its stable expose it to everyone.
Let me know your thoughts and lets connect on discord to discuss how to test this?

@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 1, 2026

Action required: PR inactive for 5 days.
Status update or closure in 10 days.

@github-actions github-actions Bot added the state: inactive No current action needed/possible; issue fixed, out of scope, or superseded. label May 1, 2026
@flazouh
Copy link
Copy Markdown
Author

flazouh commented May 3, 2026

with pleasure, i'm flaze9 on discord

@github-actions github-actions Bot removed the state: inactive No current action needed/possible; issue fixed, out of scope, or superseded. label May 4, 2026
@flazouh flazouh force-pushed the feat/machine-stdio-acp branch from de35545 to 8db5866 Compare May 4, 2026 00:45
Co-Authored-By: ForgeCode <noreply@forgecode.dev>
@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 9, 2026

Action required: PR inactive for 5 days.
Status update or closure in 10 days.

@github-actions github-actions Bot added the state: inactive No current action needed/possible; issue fixed, out of scope, or superseded. label May 9, 2026
@ssfdust
Copy link
Copy Markdown

ssfdust commented May 10, 2026

Great work!

I am testing the acp feature with the neovim plugin, and I found some critical bugs. I don't know how Acepe works, but it can't work with my neovim plugin. The following are the fixes advised by forge(model deepseek-v4-pro).

Outdated Fixes # Summary

forge machine stdio fails to connect when spawned as subprocess by agentic.nvim

Background

agentic.nvim spawns forge machine stdio with stdin/stdout pipes to communicate via the Agent Communication Protocol (JSON-RPC over stdio). However, the forge process never responds to the initialize request, causing agentic.nvim to report that it "cannot parse" the process.

Root Cause

In crates/forge_main/src/main.rs (around line 95), there is a stdin pre-read logic:

if !std::io::stdin().is_terminal() {
    let mut stdin_content = String::new();
    std::io::stdin().read_to_string(&mut stdin_content)?;
    // ...
}

When forge machine stdio is spawned as a subprocess:

  1. Stdin is a pipe (not a TTY), so is_terminal() returns false
  2. read_to_string() blocks indefinitely waiting for EOF
  3. But agentic.nvim keeps the write end of the pipe open for ongoing bidirectional JSON-RPC messages
  4. The process never reaches the ACP server initialization code

The code already had an exclusion for forge select (which also needs stdin interactivity), but machine stdio was missing from the exclusion list.

Fix

Add Machine to the stdin pre-read exclusion list (main.rs:96-99):

let needs_stdin = matches!(
    cli.subcommands,
    Some(TopLevelCommand::Select(_)) | Some(TopLevelCommand::Machine(_))
);
if !needs_stdin && !std::io::stdin().is_terminal() {
    // read piped input
}

Secondary Issue: Panic Hook Pollutes Stdout

In crates/forge_main/src/main.rs, the panic hook uses println! which writes to stdout:

panic::set_hook(Box::new(|panic_info| {
    println!("{}", TitleFormat::error(message.to_string()).display());
}));

If forge panics during initialization (e.g., corrupted config file, missing dependencies), the error message is written to stdout as plain text, which corrupts the ACP JSON-RPC data stream. This should use eprintln! (stderr) instead.

Secondary Issue: Sandbox Worktree Messages Pollute Stdout

In crates/forge_main/src/sandbox.rs (lines 72 and 128), worktree creation status messages are written to stdout:

// line 72
println!("{}", TitleFormat::info("Worktree [Reused]").sub_title(...).display());
// line 128
println!("{}", TitleFormat::info("Worktree [Created]").sub_title(...).display());

Sandbox::create() runs in main.rs before UI::init(), so when forge machine stdio --sandbox xxx is invoked, plain text is written to stdout before the ACP server starts. This should use eprintln! (stderr) instead, since stderr is a separate file descriptor from the ACP JSON-RPC transport channel.

How to Reproduce

Run any ACP client that spawns forge machine stdio with stdin/stdout pipes and sends a JSON-RPC initialize request. The forge process will hang indefinitely and never respond.

Suggested Actions

  1. Keep the Machine subcommand in the stdin pre-read exclusion list
  2. Change println! to eprintln! in the panic hook
  3. Change println! to eprintln! in sandbox.rs for worktree status messages
  4. Consider adding an integration test that verifies forge machine stdio responds to initialize when stdin is a pipe (non-TTY)

EDIT:

I add a --stdin argment to the machine stdio

@github-actions github-actions Bot removed the state: inactive No current action needed/possible; issue fixed, out of scope, or superseded. label May 10, 2026
ssfdust added a commit to ssfdust/forgecode that referenced this pull request May 11, 2026
Extracts independently-mergable fixes from the ongoing ACP work
(tailcallhq#2858) that can land on main immediately.

Three classes of fix:

1. stdin pre-read encapsulation (cli.rs, main.rs)
   Add Cli::uses_stdin() method that centralizes the decision of which
   subcommands own stdin. Subcommands opt in via uses_stdin() rather
   than having the startup pipeline guess from a hardcoded exclusion
   list. This makes it easy to add new stdin-consuming subcommands
   (e.g. an ACP stdio server) without touching the startup logic.

2. Tool output leaking to stdout (context.rs, tool_executor.rs)
   Shell tool execution streamed raw output to io::stdout(), corrupting
   the ACP JSON-RPC stream. Add silent: bool field on ToolCallContext
   (the correct home for per-invocation runtime flags). Default false;
   ACP sets .silent(true) to route output to io::sink() instead.

3. Stderr vs stdout discipline (main.rs, sandbox.rs)
   Panic hook and worktree status messages used println! which writes
   to stdout. Changed to eprintln! (stderr) to avoid contaminating
   structured transport channels.

Co-authored-by: ForgeCode <noreply@forgecode.dev>
Co-authored-by: DeepSeek <deepseek@deepseek.com>

Signed-off-by: ssfdust <ssfdust@gmail.com>
ssfdust added a commit to ssfdust/forgecode that referenced this pull request May 11, 2026
Extracts independently-mergable fixes from the ongoing ACP work
(tailcallhq#2858) that can land on main immediately.

Three classes of fix:

1. stdin pre-read encapsulation (cli.rs, main.rs)
   Add Cli::uses_stdin() method that centralizes the decision of which
   subcommands own stdin. Subcommands opt in via uses_stdin() rather
   than having the startup pipeline guess from a hardcoded exclusion
   list. This makes it easy to add new stdin-consuming subcommands
   (e.g. an ACP stdio server) without touching the startup logic.

2. Tool output leaking to stdout (context.rs, tool_executor.rs)
   Shell tool execution streamed raw output to io::stdout(), corrupting
   the ACP JSON-RPC stream. Add silent: bool field on ToolCallContext
   (the correct home for per-invocation runtime flags). Default false;
   ACP sets .silent(true) to route output to io::sink() instead.

3. Stderr vs stdout discipline (main.rs, sandbox.rs)
   Panic hook and worktree status messages used println! which writes
   to stdout. Changed to eprintln! (stderr) to avoid contaminating
   structured transport channels.

Signed-off-by: ssfdust <ssfdust@gmail.com>
Co-authored-by: ForgeCode <noreply@forgecode.dev>
Co-authored-by: DeepSeek <deepseek@deepseek.com>
ssfdust added a commit to ssfdust/forgecode that referenced this pull request May 11, 2026
Extracts independently-mergable fixes from the ongoing ACP work
(tailcallhq#2858) that can land on main immediately.

Three classes of fix:

1. stdin pre-read encapsulation (cli.rs, main.rs)
   Add Cli::uses_stdin() method that centralizes the decision of which
   subcommands own stdin. Subcommands opt in via uses_stdin() rather
   than having the startup pipeline guess from a hardcoded exclusion
   list. This makes it easy to add new stdin-consuming subcommands
   (e.g. an ACP stdio server) without touching the startup logic.

2. Tool output leaking to stdout (context.rs, tool_executor.rs)
   Shell tool execution streamed raw output to io::stdout(), corrupting
   the ACP JSON-RPC stream. Add silent: bool field on ToolCallContext
   (the correct home for per-invocation runtime flags). Default false;
   ACP sets .silent(true) to route output to io::sink() instead.

3. Stderr vs stdout discipline (main.rs, sandbox.rs)
   Panic hook and worktree status messages used println! which writes
   to stdout. Changed to eprintln! (stderr) to avoid contaminating
   structured transport channels.

Signed-off-by: ssfdust <ssfdust@gmail.com>
Co-authored-by: ForgeCode <noreply@forgecode.dev>
Co-authored-by: DeepSeek <deepseek-ai@deepseek.com>
ssfdust added a commit to ssfdust/forgecode that referenced this pull request May 11, 2026
Extracts independently-mergable fixes from the ongoing ACP work
(tailcallhq#2858) that can land on main immediately.

Three classes of fix:

1. stdin pre-read encapsulation (cli.rs, main.rs)
   Add Cli::uses_stdin() method that centralizes the decision of which
   subcommands own stdin. Subcommands opt in via uses_stdin() rather
   than having the startup pipeline guess from a hardcoded exclusion
   list. This makes it easy to add new stdin-consuming subcommands
   (e.g. an ACP stdio server) without touching the startup logic.

2. Tool output leaking to stdout (context.rs, tool_executor.rs)
   Shell tool execution streamed raw output to io::stdout(), corrupting
   the ACP JSON-RPC stream. Add silent: bool field on ToolCallContext
   (the correct home for per-invocation runtime flags). Default false;
   ACP sets .silent(true) to route output to io::sink() instead.

3. Stderr vs stdout discipline (main.rs, sandbox.rs)
   Panic hook and worktree status messages used println! which writes
   to stdout. Changed to eprintln! (stderr) to avoid contaminating
   structured transport channels.

Signed-off-by: ssfdust <ssfdust@gmail.com>
Co-authored-by: ForgeCode <noreply@forgecode.dev>
Co-authored-by: DeepSeek <deepseek-ai@deepseek.com>
ssfdust added a commit to ssfdust/forgecode that referenced this pull request May 11, 2026
Extracts independently-mergable fixes from the ongoing ACP work
(tailcallhq#2858) that can land on main immediately.

Three classes of fix:

1. stdin pre-read encapsulation (cli.rs, main.rs)
   Add Cli::uses_stdin() method that centralizes the decision of which
   subcommands own stdin. Subcommands opt in via uses_stdin() rather
   than having the startup pipeline guess from a hardcoded exclusion
   list. This makes it easy to add new stdin-consuming subcommands
   (e.g. an ACP stdio server) without touching the startup logic.

2. Tool output leaking to stdout (context.rs, tool_executor.rs)
   Shell tool execution streamed raw output to io::stdout(), corrupting
   the ACP JSON-RPC stream. Add silent: bool field on ToolCallContext
   (the correct home for per-invocation runtime flags). Default false;
   ACP sets .silent(true) to route output to io::sink() instead.

3. Stderr vs stdout discipline (main.rs, sandbox.rs)
   Panic hook and worktree status messages used println! which writes
   to stdout. Changed to eprintln! (stderr) to avoid contaminating
   structured transport channels.

Signed-off-by: ssfdust <ssfdust@gmail.com>
Co-authored-by: ForgeCode <noreply@forgecode.dev>
Co-authored-by: DeepSeek <deepseek-ai@deepseek.com>
ssfdust added a commit to ssfdust/forgecode that referenced this pull request May 12, 2026
Extracts independently-mergable fixes from the ongoing ACP work
(tailcallhq#2858) that can land on main immediately.

Three classes of fix:

1. stdin pre-read encapsulation (cli.rs, main.rs)
   Add Cli::uses_stdin() method that centralizes the decision of which
   subcommands own stdin. Subcommands opt in via uses_stdin() rather
   than having the startup pipeline guess from a hardcoded exclusion
   list. This makes it easy to add new stdin-consuming subcommands
   (e.g. an ACP stdio server) without touching the startup logic.

2. Tool output leaking to stdout (context.rs, tool_executor.rs)
   Shell tool execution streamed raw output to io::stdout(), corrupting
   the ACP JSON-RPC stream. Add silent: bool field on ToolCallContext
   (the correct home for per-invocation runtime flags). Default false;
   ACP sets .silent(true) to route output to io::sink() instead.

3. Stderr vs stdout discipline (main.rs, sandbox.rs)
   Panic hook and worktree status messages used println! which writes
   to stdout. Changed to eprintln! (stderr) to avoid contaminating
   structured transport channels.

Signed-off-by: ssfdust <ssfdust@gmail.com>
Co-authored-by: ForgeCode <noreply@forgecode.dev>
Co-authored-by: DeepSeek <deepseek-ai@deepseek.com>
@Happily-Coding
Copy link
Copy Markdown

Happily-Coding commented May 13, 2026

Awesome to see you are working on it.
I wonder if the command should be renamed to acp though. For reference

Opencode's command is :opencode acp
gemini's command is : gemini --acp

ssfdust added a commit to ssfdust/forgecode that referenced this pull request May 14, 2026
Extracts independently-mergable fixes from the ongoing ACP work
(tailcallhq#2858) that can land on main immediately.

Three classes of fix:

1. stdin pre-read encapsulation (cli.rs, main.rs)
   Add Cli::uses_stdin() method that centralizes the decision of which
   subcommands own stdin. Subcommands opt in via uses_stdin() rather
   than having the startup pipeline guess from a hardcoded exclusion
   list. This makes it easy to add new stdin-consuming subcommands
   (e.g. an ACP stdio server) without touching the startup logic.

2. Tool output leaking to stdout (context.rs, tool_executor.rs)
   Shell tool execution streamed raw output to io::stdout(), corrupting
   the ACP JSON-RPC stream. Add silent: bool field on ToolCallContext
   (the correct home for per-invocation runtime flags). Default false;
   ACP sets .silent(true) to route output to io::sink() instead.

3. Stderr vs stdout discipline (main.rs, sandbox.rs)
   Panic hook and worktree status messages used println! which writes
   to stdout. Changed to eprintln! (stderr) to avoid contaminating
   structured transport channels.

Signed-off-by: ssfdust <ssfdust@gmail.com>
Co-authored-by: ForgeCode <noreply@forgecode.dev>
Co-authored-by: DeepSeek <deepseek-ai@deepseek.com>
ssfdust added a commit to ssfdust/forgecode that referenced this pull request May 14, 2026
Extracts independently-mergable fixes from the ongoing ACP work
(tailcallhq#2858) that can land on main immediately.

Three classes of fix:

1. stdin pre-read encapsulation (cli.rs, main.rs)
   Add Cli::uses_stdin() method that centralizes the decision of which
   subcommands own stdin. Subcommands opt in via uses_stdin() rather
   than having the startup pipeline guess from a hardcoded exclusion
   list. This makes it easy to add new stdin-consuming subcommands
   (e.g. an ACP stdio server) without touching the startup logic.

2. Tool output leaking to stdout (context.rs, tool_executor.rs)
   Shell tool execution streamed raw output to io::stdout(), corrupting
   the ACP JSON-RPC stream. Add silent: bool field on ToolCallContext
   (the correct home for per-invocation runtime flags). Default false;
   ACP sets .silent(true) to route output to io::sink() instead.

3. Stderr vs stdout discipline (main.rs, sandbox.rs)
   Panic hook and worktree status messages used println! which writes
   to stdout. Changed to eprintln! (stderr) to avoid contaminating
   structured transport channels.

Signed-off-by: ssfdust <ssfdust@gmail.com>
Co-authored-by: ForgeCode <noreply@forgecode.dev>
Co-authored-by: DeepSeek <deepseek-ai@deepseek.com>
@luandro
Copy link
Copy Markdown

luandro commented May 20, 2026

Any advances on this? Seems like this got stale,

use super::error::{Error, Result};

/// Maximum number of buffered session notifications before backpressure.
const NOTIFICATION_CHANNEL_CAPACITY: usize = 1024;
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

move this to config

app.execute(data_parameters).await
}

async fn acp_start_stdio(&self) -> Result<()> {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should not be part of api, instead it should be build on top of api

@github-actions
Copy link
Copy Markdown

Action required: PR inactive for 5 days.
Status update or closure in 10 days.

@github-actions github-actions Bot added the state: inactive No current action needed/possible; issue fixed, out of scope, or superseded. label May 25, 2026
@flazouh
Copy link
Copy Markdown
Author

flazouh commented May 27, 2026

Will address those comments ASAP, guys !

@github-actions github-actions Bot removed the state: inactive No current action needed/possible; issue fixed, out of scope, or superseded. label May 27, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

type: feature Brand new functionality, features, pages, workflows, endpoints, etc.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants